package mastermind.gui.contents;

import mastermind.Application;
import mastermind.img.ImageLoader;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;

/**
 * Diese Klasse stellt das komplette Spielfeld dar<br>
 * Aufgeteilt in links die FieldUI<br>
 * und rechts die AssistantUI, welche bei Bedarf eingeblendet wird
 */
public class GameUI extends Composite
{
	// Elemente, die sich in dem Spielfeld befinden
	private static GameUI	_this;
	private FieldUI			_compField;
	private AssistantUI		_compAssistant;

	/**
	 * Erstellt ein neues GameUI Objekt
	 * 
	 * @param parent
	 *            Eltern-Objekt, auf das das GameUI Objekt plaziert wird
	 * @param style
	 *            Zus&auml;zliche Style Informationen
	 */
	public GameUI(Composite parent, int style)
	{
		super(parent, style);
		createContents();
		_this = this;
	}


	/**
	 * Hier werden alle Elemente erstellt, die ben&ouml;tigt werden um das Objekt
	 * anzuzeigen<br>
	 * Diese Funktion wird nur einmal aufgerufen
	 */
	private void createContents()
	{
		this.setBackground(ImageLoader.COLOR_BACKGROUND_GREEN);

		_compField = new FieldUI(this, SWT.NONE);

		_compAssistant = new AssistantUI(this, SWT.NONE);
		_compAssistant.setBackground(_compField.getBackground());
		_compAssistant.setBackgroundMode(SWT.INHERIT_FORCE);

	}

	/**
	 * Gibt die gr&ouml;e zur&uuml;ck, die das Spielfeld haben soll
	 */
	public Point getSize()
	{
		int x = _compField.getBounds().width + _compField.getBounds().x + 20;
		int y = _compField.getBounds().height + _compField.getBounds().y * 2;

		if (AssistantUI.isOpen())
			x += AssistantUI.getInstance().getSize().x - 20;
		return new Point(x, y);
	}

	/**
	 * Initialisiert Gr&ouml;&szlig;e und Inhalte der einzelnen Elementen
	 */
	public static void init()
	{
		FieldUI.init();
		AssistantUI.init();
		_this._compField.setBounds(0, 0, _this._compField.getSize().x, _this._compField.getSize().y);
		_this._compAssistant.setBounds(_this._compField.getSize().x, 0, _this._compAssistant.getSize().x, _this._compAssistant.getSize().y);

		resize(true);
	}

	/**
	 * Aktualisiert die Gr&ouml;&szlig;e des Fensters
	 * 
	 * @param autoLocation
	 *            true, wenn Position mit verschoben werden soll<br>
	 *            false sonst
	 */
	public static void resize(boolean autoLocation)
	{
		Application.animateWindow(_this, autoLocation);
	}

	/**
	 * Setzt die Oberfl&auml;che auf den Urzustand zur&uuml;ck;
	 */
	public static void reset()
	{
		AssistantUI.reset();
	}

}
